home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
utils
/
unix
/
unzip-5.12
/
atari
/
atari.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-15
|
27KB
|
720 lines
/*---------------------------------------------------------------------------
atari.c
Atari-specific routines for use with Info-ZIP's UnZip 5.1 and later.
Contains: readdir()
do_wild() <-- generic enough to put in file_io.c?
mapattr()
mapname()
checkdir()
mkdir()
close_outfile()
version()
Due to the amazing MiNT library being very, very close to BSD unix's
library, I'm using the unix.c as a base for this. Note: If you're not
going to compile this with the MiNT libraries (for GNU C, Turbo C, Pure C,
Lattice C, or Heat & Serve C), you're going to be in for some nasty work.
Most of the modifications in this file were made by Chris Herborth
(cherborth@semprini.waterloo-rdp.on.ca) and /should/ be marked with [cjh].
---------------------------------------------------------------------------*/
#include "unzip.h"
#include <dirent.h> /* MiNTlibs has dirent [cjh] */
static int created_dir; /* used in mapname(), checkdir() */
static int renamed_fullpath; /* ditto */
/**********************/
/* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */
/**********************/
char *do_wild(wildspec)
char *wildspec; /* only used first time on a given dir */
{
static DIR *dir = NULL;
static char *dirname, *wildname, matchname[FILNAMSIZ];
static int firstcall=TRUE, have_dirname, dirnamelen;
struct dirent *file;
/* Even when we're just returning wildspec, we *always* do so in
* matchname[]--calling routine is allowed to append four characters
* to the returned string, and wildspec may be a pointer to argv[].
*/
if (firstcall) { /* first call: must initialize everything */
firstcall = FALSE;
/* break the wildspec into a directory part and a wildcard filename */
if ((wildname = strrchr(wildspec, '/')) == NULL) {
dirname = ".";
dirnamelen = 1;
have_dirname = FALSE;
wildname = wildspec;
} else {
++wildname; /* point at character after '/' */
dirnamelen = wildname - wildspec;
if ((dirname = (char *)malloc(dirnamelen+1)) == NULL) {
fprintf(stderr, "warning: can't allocate wildcard buffers\n");
strcpy(matchname, wildspec);
return matchname; /* but maybe filespec was not a wildcard */
}
strncpy(dirname, wildspec, dirnamelen);
dirname[dirnamelen] = '\0'; /* terminate for strcpy below */
have_dirname = TRUE;
}
if ((dir = opendir(dirname)) != NULL) {
while ((file = readdir(dir)) != NULL) {
if (file->d_name[0] == '.' && wildname[0] != '.')
continue; /* Unix: '*' and '?' do not match leading dot */
/* Need something here for TOS filesystem? [cjh] */
if (match(file->d_name, wildname, 0)) { /* 0 == case sens. */
if (have_dirname) {
strcpy(matchname, dirname);
strcpy(matchname+dirnamelen, file->d_name);
} else
strcpy(matchname, file->d_name);
return matchname;
}
}
/* if we get to here directory is exhausted, so close it */
closedir(dir);
dir = NULL;
}
/* return the raw wildspec in case that works (e.g., directory not
* searchable, but filespec was not wild and file is readable) */
strcpy(matchname, wildspec);
return matchname;
}
/* last time through, might have failed opendir but returned raw wildspec */
if (dir == NULL) {
firstcall = TRUE; /* nothing left to try--reset for new wildspec */
if (have_dirname)
free(dirname);
return (char *)NULL;
}
/* If we've gotten this far, we've read and matched at least one entry
* successfully (in a previous call), so dirname has been copied into
* matchname already.
*/
while ((file = readdir(dir)) != NULL)
/* May need special TOS handling here. [cjh] */
if (match(file->d_name, wildname, 0)) { /* 0 == don't ignore case */
if (have_dirname) {
/* strcpy(matchname, dirname); */
strcpy(matchname+dirnamelen, file->d_name);
} else
strcpy(matchname, file->d_name);
return matchname;
}
closedir(dir); /* have read at least one dir entry; nothing left */
dir = NULL;
firstcall = TRUE; /* reset for new wildspec */
if (have_dirname)
free(dirname);
return (char *)NULL;
} /* end function do_wild() */
/**********************/
/* Function mapattr() */
/**********************/
int mapattr()
{
ulg tmp = crec.external_file_attributes;
switch (pInfo->hostnum) {
case UNIX_:
/* minix filesystem under MiNT on Atari [cjh] */
case VMS_:
pInfo->file_attr = (unsigned)(tmp >> 16);
return 0;
case AMIGA_:
tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */
pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp);
break;
/* all remaining cases: expand MSDOS read-only bit into write perms */
case FS_FAT_:
case FS_HPFS_:
case FS_NTFS_:
case MAC_:
case ATARI_: /* (used to set = 0666) */
/* TOS filesystem [cjh] */
case TOPS20_:
default:
tmp = !(tmp & 1) << 1; /* read-only bit --> write perms bits */
pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp);
break;
} /* end switch (host-OS-created-by) */
/* for originating systems with no concept of "group," "other," "system": */
umask( (int)(tmp=umask(0)) ); /* apply mask to expanded r/w(/x) perms */
pInfo->file_attr &= ~tmp;
return 0;
} /* end function mapattr() */
/************************/
/* Function mapname() */
/************************/
int mapname(renamed) /* return 0 if no error, 1 if caution (filename trunc), */
int renamed; /* 2 if warning (skip file because dir doesn't exist), */
{ /* 3 if error (skip file), 10 if no memory (skip file) */
char pathcomp[FILNAMSIZ]; /* path-component buffer */
char *pp, *cp=NULL; /* character pointers */
char *lastsemi = NULL; /* pointer to last semi-colon in pathcomp */
int quote = FALSE; /* flags */
int error = 0;
register unsigned workch; /* hold the character being tested */
/*---------------------------------------------------------------------------
Initialize various pointers and counters and stuff.
---------------------------------------------------------------------------*/
if (pInfo->vollabel)
return IZ_VOL_LABEL; /* can't set disk volume labels in Unix */
/* can create path as long as not just freshening, or if user told us */
create_dirs = (!fflag || renamed);
created_dir = FALSE; /* not yet */
/* user gave full pathname: don't prepend rootpath */
renamed_fullpath = (renamed && (*filename == '/'));
if (checkdir((char *)NULL, INIT) == 10)
return 10; /* initialize path buffer, unless no memory */
*pathcomp = '\0'; /* initialize translation buffer */
pp = pathcomp; /* point to translation buffer */
if (jflag) /* junking directories */
cp = (char *)strrchr(filename, '/');
if (cp == NULL) /* no '/' or not junking dirs */
cp = filename; /* point to internal zipfile-member pathname */
else
++cp; /* point to start of last component of path */
/*---------------------------------------------------------------------------
Begin main loop through characters in filename.
---------------------------------------------------